/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SubsistemaPaciente.OrdenDeDerivacion;

import SubsistemaPaciente.OrdenDeDerivacion.DialogoInfoOrdenDeDerivacion;
import clienteSandraParada.Login;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import ordenar.Ordenar;
import service.OrdenDeDerivacion;
import service.Paciente;
import service.ProfesionalExterno;

/**
 *
 * @author rodrigo
 */
public class OrdenDerivacion extends javax.swing.JPanel {

    /**
     * constructor de la clase
     */
    public OrdenDerivacion() {
        initComponents();
        this.inicializarFechas();
        this.actualizarTabla();
        this.ocultarColumnaID();
        this.keyListenerBuscar();
        this.MouseListenerTabla();

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        dialogoEliminarDerivacion = new javax.swing.JDialog();
        botonSiEliminar = new javax.swing.JButton();
        botonNoEliminar = new javax.swing.JButton();
        etiquetaEliminar = new javax.swing.JLabel();
        jPanel5 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        jScrollPane4 = new javax.swing.JScrollPane();
        tablaDerivaciones = new javax.swing.JTable();
        buscar = new javax.swing.JTextField();
        hasta = new com.toedter.calendar.JDateChooser();
        jLabel1 = new javax.swing.JLabel();
        desde = new com.toedter.calendar.JDateChooser();
        jLabel2 = new javax.swing.JLabel();
        campoTotalaPagar = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jPanel7 = new javax.swing.JPanel();
        botonAgregarDerivacion = new javax.swing.JButton();
        botonEliminarDerivacion = new javax.swing.JButton();
        botonModificarDerivacion = new javax.swing.JButton();
        botonVerDerivacion = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        etiquetaMensajeria = new javax.swing.JLabel();

        dialogoEliminarDerivacion.setTitle("Eliminar derivación");
        dialogoEliminarDerivacion.setMinimumSize(new java.awt.Dimension(430, 160));
        dialogoEliminarDerivacion.setModal(true);
        dialogoEliminarDerivacion.setResizable(false);

        botonSiEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Aceptar.png"))); // NOI18N
        botonSiEliminar.setText("Si");
        botonSiEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiEliminarActionPerformed(evt);
            }
        });

        botonNoEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Cancelar.png"))); // NOI18N
        botonNoEliminar.setText("No");
        botonNoEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonNoEliminarActionPerformed(evt);
            }
        });

        etiquetaEliminar.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        etiquetaEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Papelera.png"))); // NOI18N
        etiquetaEliminar.setText("¿Confirma que desea enviar a la papelera la orden de derivación seleccionada?");

        javax.swing.GroupLayout dialogoEliminarDerivacionLayout = new javax.swing.GroupLayout(dialogoEliminarDerivacion.getContentPane());
        dialogoEliminarDerivacion.getContentPane().setLayout(dialogoEliminarDerivacionLayout);
        dialogoEliminarDerivacionLayout.setHorizontalGroup(
            dialogoEliminarDerivacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, dialogoEliminarDerivacionLayout.createSequentialGroup()
                .addContainerGap(289, Short.MAX_VALUE)
                .addComponent(botonSiEliminar, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonNoEliminar, javax.swing.GroupLayout.PREFERRED_SIZE, 78, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addComponent(etiquetaEliminar, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE)
        );
        dialogoEliminarDerivacionLayout.setVerticalGroup(
            dialogoEliminarDerivacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(dialogoEliminarDerivacionLayout.createSequentialGroup()
                .addGap(35, 35, 35)
                .addComponent(etiquetaEliminar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE)
                .addGroup(dialogoEliminarDerivacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonSiEliminar)
                    .addComponent(botonNoEliminar))
                .addContainerGap())
        );

        setMaximumSize(new java.awt.Dimension(953, 603));
        setPreferredSize(new java.awt.Dimension(953, 499));

        jPanel5.setBackground(new java.awt.Color(255, 255, 255));
        jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), "Ordenes de Derivación", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.TOP, new java.awt.Font("Tahoma", 0, 36))); // NOI18N
        jPanel5.setMaximumSize(new java.awt.Dimension(950, 32767));
        jPanel5.setPreferredSize(new java.awt.Dimension(950, 451));

        jLabel4.setText("Buscar ");

        tablaDerivaciones.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Rut profesional", "Nombre profesional", "Rut paciente", "Nombre paciente", "Especialidad", "Diagnóstico", "Costo atención", "Monto a pagar", "Fecha"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.Object.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tablaDerivaciones.setMaximumSize(new java.awt.Dimension(950, 800));
        tablaDerivaciones.setName(""); // NOI18N
        tablaDerivaciones.getTableHeader().setReorderingAllowed(false);
        jScrollPane4.setViewportView(tablaDerivaciones);

        hasta.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                hastaPropertyChange(evt);
            }
        });

        jLabel1.setText("Hasta:");

        desde.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                desdePropertyChange(evt);
            }
        });

        jLabel2.setText("Desde:");

        campoTotalaPagar.setEditable(false);
        campoTotalaPagar.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        campoTotalaPagar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoTotalaPagarActionPerformed(evt);
            }
        });

        jLabel3.setText("Total a pagar: ");

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addGap(425, 425, 425)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(campoTotalaPagar, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(366, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 933, Short.MAX_VALUE)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addGap(18, 18, 18)
                        .addComponent(desde, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(44, 44, 44)
                        .addComponent(jLabel1)
                        .addGap(18, 18, 18)
                        .addComponent(hasta, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 344, Short.MAX_VALUE)
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(buscar, javax.swing.GroupLayout.PREFERRED_SIZE, 176, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(10, 10, 10))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel4)
                        .addComponent(buscar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(hasta, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(desde, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE, false)
                    .addComponent(campoTotalaPagar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );

        jPanel7.setBackground(new java.awt.Color(255, 255, 255));

        botonAgregarDerivacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Agregar.png"))); // NOI18N
        botonAgregarDerivacion.setText("Agregar");
        botonAgregarDerivacion.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        botonAgregarDerivacion.setMargin(new java.awt.Insets(2, 4, 2, 6));
        botonAgregarDerivacion.setMaximumSize(new java.awt.Dimension(97, 43));
        botonAgregarDerivacion.setMinimumSize(new java.awt.Dimension(97, 43));
        botonAgregarDerivacion.setPreferredSize(new java.awt.Dimension(97, 43));
        botonAgregarDerivacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAgregarDerivacionActionPerformed(evt);
            }
        });

        botonEliminarDerivacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/delete_32x32x32.png"))); // NOI18N
        botonEliminarDerivacion.setText("Eliminar");
        botonEliminarDerivacion.setMargin(new java.awt.Insets(2, 4, 2, 6));
        botonEliminarDerivacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEliminarDerivacionActionPerformed(evt);
            }
        });

        botonModificarDerivacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Edit.png"))); // NOI18N
        botonModificarDerivacion.setText("Modificar");
        botonModificarDerivacion.setMargin(new java.awt.Insets(2, 4, 2, 6));
        botonModificarDerivacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonModificarDerivacionActionPerformed(evt);
            }
        });

        botonVerDerivacion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos35X35/Previsualizar.png"))); // NOI18N
        botonVerDerivacion.setText("Ver");
        botonVerDerivacion.setMargin(new java.awt.Insets(2, 4, 2, 6));
        botonVerDerivacion.setMaximumSize(new java.awt.Dimension(97, 43));
        botonVerDerivacion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonVerDerivacionActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                .addContainerGap(409, Short.MAX_VALUE)
                .addComponent(botonAgregarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonModificarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonEliminarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(botonVerDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {botonAgregarDerivacion, botonEliminarDerivacion, botonModificarDerivacion, botonVerDerivacion});

        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                .addContainerGap(20, Short.MAX_VALUE)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonEliminarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonAgregarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonModificarDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonVerDerivacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {botonAgregarDerivacion, botonEliminarDerivacion, botonModificarDerivacion, botonVerDerivacion});

        jPanel1.setBackground(java.awt.Color.white);

        etiquetaMensajeria.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        etiquetaMensajeria.setText("Área de mensajería");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(etiquetaMensajeria, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 953, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addComponent(etiquetaMensajeria, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, 953, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, 386, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        jPanel5.getAccessibleContext().setAccessibleName("Derivaciones");
    }// </editor-fold>//GEN-END:initComponents

    /**
     * evento que se encarga de escuchar los eventos para facilitar la busqueda dinamica
     */
    public void keyListenerBuscar() {
        this.buscar.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                //realizo busqueda dinamica
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!buscar.getText().equals("")) {
                    actualizarTabla();
                    actualizarTablaBusqueda(buscar.getText());
                } else {
                    actualizarTabla();
                }
            }
        });

    }

    public String darFormatoDinero(String num) {


        String a = "";
        int con = 0;
        for (int i = num.length() - 1; i >= 0; i--) {
            if (con == 2 && i > 0) {
                con = 0;
                a = a + num.charAt(i) + ".";
            } else {
                a = a + num.charAt(i);
                con++;
            }
        }
        String b = "";
        for (int i = a.length() - 1; i >= 0; i--) {
            b = b + a.charAt(i);
        }

        return "$" + b;

    }

    /**
     * @method que se encarga de inicializar las fechas con la fechas de hoy
     */
    public void inicializarFechas() {
        Date fechaHoy = Calendar.getInstance().getTime();
        this.desde.setDate(fechaHoy);
        this.hasta.setDate(fechaHoy);
    }

    /**
     * evento de la tabla que permite realizar doble click
     */
    public void MouseListenerTabla() {
        this.tablaDerivaciones.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
                    if (p.isVerOrdenDerivacion()) {
                        normalizarEtiquetaMensajeria();
                        if (tablaDerivaciones.getSelectedRow() == -1) {
                            etiquetaMensajeria.setText("Debe seleccionar una orden de derivación para verla");
                            etiquetaMensajeria.setForeground(Color.red);
                        } else {
                            DialogoInfoOrdenDeDerivacion dip = new DialogoInfoOrdenDeDerivacion(null, true, null, Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0)));
                            dip.normalizarMensajeria();
                            dip.setLocationRelativeTo(null);
                            dip.setTitle("Ver Orden De Derivación");
                            dip.getBotonAceptar().setText("Exportar");
                            dip.getBotonAceptar().setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/pdf.png")));
                            dip.getBotonCancelar().setText("Cancelar");
                            service.OrdenDeDerivacion pres = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion((Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0))));
                            dip.cargarPacientes();
                            dip.cargarProfesionales();
                            dip.llenarCampos(pres);
                            dip.inhabilitarCampos();
                            dip.setVisible(true);
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "No tiene permisos para esta acción, \n contacte al administrador para más información");
                    }
                }
            }

            @Override
            public void mousePressed(MouseEvent e) {
            }

            @Override
            public void mouseReleased(MouseEvent e) {
            }

            @Override
            public void mouseEntered(MouseEvent e) {
            }

            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
    }

    /**
     * @method que se encarga de actulizar la tabla
     */
    public void actualizarTabla() {
        this.limpiarTabla();
        java.util.List<service.OrdenDeDerivacion> derivaciones = listarDerivaciones();
        Ordenar.ordena(derivaciones, "id");
        int i = 0;
        int total = 0;
        for (service.OrdenDeDerivacion p : derivaciones) {
            if (p.isVisible()) {
                Date d = this.stringToDate(p.getFechaEmision());
                if (this.desde.getDate().before(d) && this.hasta.getDate().after(d) || esMismoDia(this.desde.getDate(), d)
                        || esMismoDia(this.hasta.getDate(), d)) {
                    this.agregarFila();
                    service.Paciente pa = (service.Paciente) cargarPaciente(p.getRutPaciente());
                    service.ProfesionalExterno ex = (service.ProfesionalExterno) cargarProfesionalExterno(p.getRutProfesional());
                    tablaDerivaciones.setValueAt(p.getId().toString(), i, 0);
                    tablaDerivaciones.setValueAt(p.getRutProfesional(), i, 1);
                    String nombrePro = ex.getNombres() + " " + ex.getApellidoPaterno() + " " + ex.getApellidoMaterno();
                    tablaDerivaciones.setValueAt(nombrePro, i, 2);
                    tablaDerivaciones.setValueAt(p.getRutPaciente(), i, 3);
                    String nombrePa = pa.getNombres() + " " + pa.getApellidoPaterno() + " " + pa.getApellidoMaterno();
                    tablaDerivaciones.setValueAt(nombrePa, i, 4);
                    tablaDerivaciones.setValueAt(p.getEspecialidad(), i, 5);
                    tablaDerivaciones.setValueAt(p.getDiagnostico(), i, 6);
                    tablaDerivaciones.setValueAt(darFormatoDinero(p.getCostoAtencion()), i, 7);
                    tablaDerivaciones.setValueAt(llenarMontoaPagar(p.getRutProfesional(), darFormatoDinero(p.getCostoAtencion())), i, 8);
                    tablaDerivaciones.setValueAt(p.getFechaEmision(), i, 9);
                    String montoASumar = (String) tablaDerivaciones.getValueAt(i, 8);
                    i++;
                    if (!montoASumar.equals("")) {
                        total += soloNumeros(montoASumar);
                    }
                }
            }
        }
        this.campoTotalaPagar.setText(darFormatoDinero(Integer.toString(total)));
    }
    /*
     *@method se en carga de verificar si dos fechas son iguales
     * @return boolean true si son iguales o false si son diferentes
     */

    private static boolean esMismoDia(Date fecha1, Date fecha2) {
        if (fecha1 == null || fecha2 == null) {
            throw new IllegalArgumentException("Las fechas no pueden ser null");
        }
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(fecha1);
        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(fecha2);
        return isSameDay(cal1, cal2);
    }
    /*
     * se en carga de verificar si dos calendar son iguales
     * @return boolean true si son iguales o false si son diferentes
     */

    private static boolean isSameDay(Calendar cal1, Calendar cal2) {
        if (cal1 == null || cal2 == null) {
            throw new IllegalArgumentException("Las fechas no pueden ser null");
        }
        return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
    }

    /**
     * @method toma un string con mascarilla dinero y retorna otro String solo con los numeros
     * @param dinero
     * @return
     */
    public int soloNumeros(String dinero) {
        String t = dinero.substring(1, dinero.length());
        String num = "";
        for (int i = 0; i < t.length(); i++) {
            if (t.charAt(i) != '.') {
                num = num + t.charAt(i);
            }
        }
        return Integer.parseInt(num);
    }

    /**
     * llena el campo de monto a pagar a un profesional
     * @return
     */
    public String llenarMontoaPagar(String rut, String costoAtencion) {
        List<service.Convenio> convenios = listarConvenios();
        boolean encontro = false;
        int porcentaje = 0;
        for (service.Convenio c : convenios) {
            if (c.getRutInstitucion().equals(rut)) {
                encontro = true;
                porcentaje = Integer.parseInt(c.getPorcentaje().replace("%", ""));
            }
        }
        if (!costoAtencion.equals("") && encontro) {
            // calculo precio para total
            return darFormatoDinero(Integer.toString((soloNumeros(costoAtencion) * porcentaje) / 100));
        } else {
            return "$0";
        }
    }
    /*
     * @method convierte un string a date
     */

    public Date stringToDate(String strFecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        Date fecha = null;
        try {
            fecha = formatoDelTexto.parse(strFecha);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;
    }

    /**
     * @method que se encarga de actualizar la tabla que contengan coincidencias con la palabra a buscar
     * @param buscar
     */
    public void actualizarTablaBusqueda(String buscar) {
        int montoTotal = soloNumeros(this.campoTotalaPagar.getText());
        DefaultTableModel temp = (DefaultTableModel) tablaDerivaciones.getModel();
        for (int i = 0; i < temp.getRowCount(); i++) {
            if (!contienePalabra(buscar, temp, i)) {
                String montoARestar = (String) tablaDerivaciones.getValueAt(i, 8);
                if (!montoARestar.equals("")) {
                    montoTotal -= soloNumeros(montoARestar);
                }
                temp.removeRow(i);
                i--;
            }

        }
        this.campoTotalaPagar.setText(darFormatoDinero(Integer.toString(montoTotal)));
    }

    /**
     * @method que verifica si una columna de la tabla contiene alguna coincidencia con la palabra a buscar
     * @param buscar
     * @param temp
     * @param fila
     * @return
     */
    public boolean contienePalabra(String buscar, DefaultTableModel temp, int fila) {
        int coincidencias = 0;
        int j = 0;
        if (temp.getColumnName(0).equals("ID")) {
            j++;
        }
        for (int i = j; i < temp.getColumnCount(); i++) {
            String frase = (String) temp.getValueAt(fila, i);
            if ((frase.toUpperCase()).contains(buscar.toUpperCase())) {
                coincidencias += 1; // existe una columna que coincide con la palabra buscada
            }
        }
        if (coincidencias == 0) {
            return false; // no existen coincidencias
        } else {
            return true;
        }
    }

    /**
     * @method que agrega una fila a la tabla
     */
    public void agregarFila() {
        DefaultTableModel temp = (DefaultTableModel) tablaDerivaciones.getModel();
        Object nuevo[] = {"", "", "", "", "", "", "", "", "", ""};
        temp.addRow(nuevo);
    }

    private void botonModificarDerivacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonModificarDerivacionActionPerformed
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isModificarOrdenDerivacion()) {
            this.normalizarEtiquetaMensajeria();
            if (tablaDerivaciones.getSelectedRow() == -1) {
                etiquetaMensajeria.setText("Debe seleccionar una Orden de derivación para ser modificada");
                etiquetaMensajeria.setForeground(Color.red);
            } else {
                DialogoInfoOrdenDeDerivacion dip = new DialogoInfoOrdenDeDerivacion(null, true, this, Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0)));
                dip.normalizarMensajeria();
                dip.setLocationRelativeTo(null);
                dip.setTitle("Modificar Orden De Derivación");
                dip.getBotonAceptar().setText("Guardar");
                dip.getBotonAceptar().setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Aceptar.png")));
                dip.getBotonCancelar().setText("Cancelar");
                service.OrdenDeDerivacion der = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion((Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0))));
                dip.cargarPacientes();
                dip.cargarProfesionales();
                dip.llenarCampos(der);
                dip.habilitarCampos();
                dip.setVisible(true);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonModificarDerivacionActionPerformed

    private void botonEliminarDerivacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEliminarDerivacionActionPerformed
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isEliminarOrdenDerivacion()) {
            this.normalizarEtiquetaMensajeria();
            int cont = 0;
            for (int i = 0; i < tablaDerivaciones.getRowCount(); i++) {
                if (tablaDerivaciones.isRowSelected(i)) {
                    cont++;
                }
            }
            if (cont >= 1) {
                if (cont > 1) {
                    etiquetaEliminar.setText("¿Confirma que desea enviar a la papelera las ordenes de derivaciones seleccionadas?");
                } else if (cont == 1) {
                    etiquetaEliminar.setText("¿Confirma que desea enviar a la papelera la orden de derivación seleccionada?");
                }
                dialogoEliminarDerivacion.setLocationRelativeTo(null);
                dialogoEliminarDerivacion.setVisible(true);
            } else {
                this.cambiarEtiquetaMensajeria("Debe seleccionar una orden de derivación para ser eliminada", Color.red);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonEliminarDerivacionActionPerformed

    private void botonAgregarDerivacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAgregarDerivacionActionPerformed
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isAgregarOrdenDerivacion()) {
            this.normalizarEtiquetaMensajeria();
            DialogoInfoOrdenDeDerivacion dip = new DialogoInfoOrdenDeDerivacion(null, true, this, null);
            dip.normalizarMensajeria();
            dip.limpiarCampos();
            dip.setLocationRelativeTo(null);
            dip.setTitle("Agregar Orden De Derivación");
            dip.getBotonAceptar().setText("Agregar");
            dip.getBotonAceptar().setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Agregar.png")));
            dip.getBotonCancelar().setText("Cancelar");
            dip.cargarPacientes();
            dip.cargarProfesionales();
            dip.habilitarCampos();
            dip.setVisible(true);
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonAgregarDerivacionActionPerformed

    private void botonVerDerivacionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonVerDerivacionActionPerformed
        service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
        if (p.isVerOrdenDerivacion()) {
            this.normalizarEtiquetaMensajeria();
            if (tablaDerivaciones.getSelectedRow() == -1) {
                etiquetaMensajeria.setText("Debe seleccionar una orden de derivación para verla");
                etiquetaMensajeria.setForeground(Color.red);
            } else {
                DialogoInfoOrdenDeDerivacion dip = new DialogoInfoOrdenDeDerivacion(null, true, this, Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0)));
                dip.normalizarMensajeria();
                dip.setLocationRelativeTo(null);
                dip.setTitle("Ver Orden De Derivación");
                dip.getBotonAceptar().setText("Exportar");
                dip.getBotonAceptar().setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/pdf.png")));
                dip.getBotonCancelar().setText("Cancelar");
                service.OrdenDeDerivacion pres = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion((Long.parseLong((String) tablaDerivaciones.getValueAt(tablaDerivaciones.getSelectedRow(), 0))));                
                dip.cargarPacientes();
                dip.cargarProfesionales();
                dip.llenarCampos(pres);
                dip.inhabilitarCampos();
                dip.setVisible(true);
            }
        } else {
            JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
        }
    }//GEN-LAST:event_botonVerDerivacionActionPerformed

    private void hastaPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_hastaPropertyChange
        // TODO add your handling code here:
        this.cambiarEtiquetaMensajeria("Área de Mensajería ", Color.black);
        if (this.desde.getDate() != null && this.hasta.getDate() != null) {
            if (this.desde.getDate().after(this.hasta.getDate())) {
                this.cambiarEtiquetaMensajeria("Rango de fechas erróneas", Color.red);
            }
            if (!buscar.getText().equals("")) {
                actualizarTabla();
                actualizarTablaBusqueda(buscar.getText());
            } else {
                actualizarTabla();
            }
        }
}//GEN-LAST:event_hastaPropertyChange

    private void desdePropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_desdePropertyChange
        // TODO add your handling code here:
        // if muy necesario ya que al momento de setear una fecha dentro del codigo llama de imediato a este
        //metodo por lo tanto si se setea solo uno va  a tomar el otro null y se caera el programa
        this.cambiarEtiquetaMensajeria("Área de Mensajería ", Color.black);
        if (this.desde.getDate() != null && this.hasta.getDate() != null) {
            if (this.desde.getDate().after(this.hasta.getDate())) {
                this.cambiarEtiquetaMensajeria("Rango de fechas erróneas", Color.red);
            }
            if (!buscar.getText().equals("")) {
                actualizarTabla();
                actualizarTablaBusqueda(buscar.getText());
            } else {
                actualizarTabla();
            }
        }
}//GEN-LAST:event_desdePropertyChange

    private void campoTotalaPagarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoTotalaPagarActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_campoTotalaPagarActionPerformed

    private void botonSiEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiEliminarActionPerformed
        this.normalizarEtiquetaMensajeria();
        for (int i = 0; i < tablaDerivaciones.getRowCount(); i++) {
            if (tablaDerivaciones.isRowSelected(i)) {
                service.OrdenDeDerivacion o = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion(Long.parseLong((String) tablaDerivaciones.getValueAt(i, 0)));
                o.setVisible(false);
                modificarOrdenDeDerivacion(o);
                String valorNuevo = " Rut profesional:" + o.getRutProfesional() + "\n" + " Rut paciente:" + o.getRutPaciente() + "\n" + " Especialidad:" + o.getEspecialidad() + "\n" + " Diagnóstico:" + o.getDiagnostico() + "\n" + " Costo atención:" + o.getCostoAtencion() + "\n" + " Fecha emisión:" + o.getFechaEmision();
                registrar(Login.getUser(), "Orden de derivación", "Eliminó orden de derivación a profesional externo:" + o.getRutProfesional() + "de paciente :" + o.getRutPaciente(), "No aplica", valorNuevo);
            }
        }
        this.actualizarTabla();
        dialogoEliminarDerivacion.dispose();
    }//GEN-LAST:event_botonSiEliminarActionPerformed

    private void botonNoEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonNoEliminarActionPerformed
        dialogoEliminarDerivacion.dispose();
}//GEN-LAST:event_botonNoEliminarActionPerformed
    /**
     * @method metodo que cambia el area de mensajeria
     * @param mensaje parametro String con el contenido del mensaje
     * @param color parametro con el tipo de color a cambiar
     */
    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        etiquetaMensajeria.setText(mensaje);
        etiquetaMensajeria.setForeground(color);
    }

    /**
     * @method que limpia la tabla
     */
    public void limpiarTabla() {
        DefaultTableModel temp = (DefaultTableModel) tablaDerivaciones.getModel();
        for (int i = tablaDerivaciones.getRowCount() - 1; i >= 0; i--) {
            temp.removeRow(i);
        }
    }

    /**
     * @method que normaliza el area de mensajeria
     */
    public void normalizarEtiquetaMensajeria() {
        etiquetaMensajeria.setText("Área de mensajería");
        etiquetaMensajeria.setForeground(Color.black);
    }

    public void ocultarColumnaID() {
        tablaDerivaciones.getColumnModel().getColumn(0).setMaxWidth(0);
        tablaDerivaciones.getColumnModel().getColumn(0).setMinWidth(0);
        tablaDerivaciones.getColumnModel().getColumn(0).setPreferredWidth(0);
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAgregarDerivacion;
    private javax.swing.JButton botonEliminarDerivacion;
    private javax.swing.JButton botonModificarDerivacion;
    private javax.swing.JButton botonNoEliminar;
    private javax.swing.JButton botonSiEliminar;
    private javax.swing.JButton botonVerDerivacion;
    private javax.swing.JTextField buscar;
    private javax.swing.JTextField campoTotalaPagar;
    private com.toedter.calendar.JDateChooser desde;
    private javax.swing.JDialog dialogoEliminarDerivacion;
    private javax.swing.JLabel etiquetaEliminar;
    private javax.swing.JLabel etiquetaMensajeria;
    private com.toedter.calendar.JDateChooser hasta;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JTable tablaDerivaciones;
    // End of variables declaration//GEN-END:variables

    private static boolean modificarOrdenDeDerivacion(service.OrdenDeDerivacion ordenDeDerivacion) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.modificarOrdenDeDerivacion(ordenDeDerivacion);
    }

    private static Object buscarOrdenDeDerivacion(java.lang.Long idOrden) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.buscarOrdenDeDerivacion(idOrden);
    }

    private static java.util.List<service.OrdenDeDerivacion> listarDerivaciones() {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.listarDerivaciones();
    }

    private static String buscarOrden(java.lang.String buscar) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.buscarOrden(buscar);
    }

    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }

    private static Object cargarProfesionalExterno(java.lang.String rut) {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.cargarProfesionalExterno(rut);
    }

    private static Object cargarPaciente(java.lang.String rut) {
        service.PacienteWS_Service service = new service.PacienteWS_Service();
        service.PacienteWS port = service.getPacienteWSPort();
        return port.cargarPaciente(rut);
    }

    private static java.util.List<service.Convenio> listarConvenios() {
        service.ConvenioWSService service = new service.ConvenioWSService();
        service.ConvenioWS port = service.getConvenioWSPort();
        return port.listarConvenios();
    }
}
